/*************************************************
 File name : lcd_bmp.c
 Create date : 2015-04-14 23:41
 Modified date : 2015-04-14 23:41
 Author : heqingde
 Email : hqd173@163.com
 
 ***********************************************/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/mman.h>

//文件头结构 14
typedef struct BmpFileHeader { 
	/*位图类别，根据不同的操作系统而不同,此字段的值总为‘BM’*/
	short    bfType; 
	int   bfSize; //BMP图像文件的大小3
	short    bfReserved1;//总为0
	short   bfReserved2; //总为0
	int    bfOffBits; //BMP图像数据的地址
} BmpFileHeader;
 
 
 //图片信息结构
typedef struct BmpInfoHeader{ 
	/*本结构的大小，根据不同的操作系统而不同，
	此字段的值总为28h字节=40字节*/
	int      biSize;
	int      biWidth; //BMP图像的宽度，单位像素
	int        biHeight; 
	short       biPlanes; //总为0
	/*BMP图像的色深，即一个像素用多少位表示，常见有1、4、8、16、24和32，
	分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色*/
	short       biBitCount; 
	/*压缩方式，0表示不压缩，1表示RLE8压缩，
	2表示RLE4压缩，3表示每个像素值由指定的掩码决定*/
	int      biCompression; 
	/*BMP图像数据大小，必须是4的倍数，
	图像数据大小不是4的倍数时用0填充补足*/
	int      biSizeImage; 
	int        biXPelsPerMeter; //水平分辨率，单位像素/m
	int        biYPelsPerMeter; //垂直分辨率，单位像素/m

	/*BMP图像使用的颜色，0表示使用全部颜色，
	对于256色位图来说，此值为100h=256*/
	int      biClrUsed; 
	/*重要的颜色数，此值为0时所有颜色都重要，
	对于使用调色板的BMP图像来说，
	当显卡不能够显示所有颜色时，此值将辅助驱动程序显示颜色*/
	int      biClrImportant; 
} BmpInfoHeader;
 


int main(void)
{
			//1.打开设备
		int fd = open("/dev/fb0", O_RDWR);
		//2.映射lcd到用户空间
		unsigned int *p = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);	
		//3.打开图片
		int picfd = open("./lijian.bmp", O_RDONLY);
		//4.读取图片头（54字节）
			//计算文件大小
			int len = lseek(picfd, 0, SEEK_END);
			lseek(picfd, 0, SEEK_SET);
			char buf[len];
			int ret = read(picfd, buf, 54);
			ret = read(picfd, buf, len);
		//5.把图片rgb数据转换为lcd能显示argb数据 buf->rgb rgb rgb rgb rgb rgb rgb
			//把rgb组合成一个int data 
			printf("ret = %d\n", ret/3);
			unsigned int data = 0;
			unsigned char *b = buf;
			//把data赋值给lcd
			int i = 0;
			for(i=0; i<800*480; i++)
			{
				data = *(b+2);
				data |= *(b+1)<<8;
				data |= *b<<16;
				
				*(p+i) = data;
				b += 4;
			}
		//6.释放映射，关闭文件
			munmap(p, 800*480*4);
			close(fd);
			close(picfd);
	
}